from rest_framework.authentication import BaseAuthentication
from rest_framework.exceptions import AuthenticationFailed
from utils.jwttool import tool
import jwt#想要使用jwt的异常
from  user.models import User

class MyAuthentication(BaseAuthentication):
    def authenticate(self, request):
        # 在这里编写你的认证逻辑
        #写解析token的逻辑  在解析的过程中可能会遇到异常 给抛出就行
        # 1 获取到token  前端会在请求头中携带token 我们获取请求的数据在drf中有两种方式reqeust.query_params request.data
        mytoken=request.META.get("HTTP_AUTHORIZATION","")
        #print(mytoken)
        # 2 判断token是否存在 不存在就抛出异常
        if not mytoken:
            raise AuthenticationFailed("缺少token")
        # 3 解析token
        try:
            payload=tool.parsejwt(mytoken)#解析token的时候可能会有异常
            #根据返回的载荷信息 获取到用户id payload["user"] 去数据库中查询 如果不存在用户  就抛出异常
            info=User.objects.filter(id=payload["user"]).first()
            if not info:
                raise AuthenticationFailed("用户不存在")
            return (info.id,None)
        except jwt.ExpiredSignatureError:
            raise AuthenticationFailed("token过期")
        except jwt.InvalidTokenError:
            raise AuthenticationFailed("token无效")

